All files / src context.ts

88.89% Statements 24/27
66.67% Branches 4/6
100% Functions 5/5
86.36% Lines 19/22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76                                                              3x 4x   3x   11x 11x 10x   1x             3x       11x     11x 11x 1x     1x           10x       3x 11x 11x 11x   3x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { FirebaseApp } from '@firebase/app-types';
import { _FirebaseApp } from '@firebase/app-types/private';
import { firebase } from '@firebase/app';
import { FirebaseMessaging } from '@firebase/messaging-types';
 
/**
 * The metadata that should be supplied with function calls.
 */
export interface Context {
  authToken?: string;
  instanceIdToken?: string;
}
 
/**
 * Helper class to get metadata that should be included with a function call.
 */
export class ContextProvider {
  constructor(private readonly app: FirebaseApp) {}
 
  async getAuthToken(): Promise<string | undefined> {
    try {
      const token = await (this.app as _FirebaseApp).INTERNAL.getToken();
      if (!token) {
        return undefined;
      }
      return token.accessToken;
    } catch (e) {
      // If there's any error when trying to get the auth token, leave it off.
      return undefined;
    }
  }
 
  async getInstanceIdToken(): Promise<string | undefined> {
    try {
      // HACK: Until we have a separate instanceId package, this is a quick way
      // to load in the messaging instance for this app.
      Iif (!(this.app as any).messaging) {
        return undefined;
      }
      const messaging = (this.app as any).messaging() as FirebaseMessaging;
      const token = await messaging.getToken();
      Iif (!token) {
        return undefined;
      }
      return token;
    } catch (e) {
      // We don't warn on this, because it usually means messaging isn't set up.
      // console.warn('Failed to retrieve instance id token.', e);
 
      // If there's any error when trying to get the token, leave it off.
      return undefined;
    }
  }
 
  public async getContext(): Promise<Context> {
    const authToken = await this.getAuthToken();
    const instanceIdToken = await this.getInstanceIdToken();
    return { authToken, instanceIdToken };
  }
}